import { AxiosRequestConfig, AxiosResponse } from "../types";

export class AxiosError extends Error {
  // 1. 声明子类特有的属性（这些属性是 AxiosError 独有的）
  isAxiosError: boolean; // 所有实例都有这个属性，且恒为 true
  config: AxiosRequestConfig; // 请求配置（如 url、method 等）
  code?: string | null; // 错误码（如 'ECONNABORTED' 表示超时）
  request?: any;
  response?: AxiosResponse;

  /* istanbul ignore next */
  // 2. 构造函数：接收外部参数，初始化属性
  constructor(
    message: string, // 传递给父类 Error 的消息
    config: AxiosRequestConfig, // 子类特有的参数：请求配置
    code?: string | null,
    request?: any,
    response?: AxiosResponse
  ) {
    // 3. 必须先调用父类的构造函数（super）
    super(message); // 调用 Error 类的 constructor，初始化 message 属性

    // 4. 初始化子类特有的属性
    this.config = config; // 保存请求配置
    this.code = code; // 错误码（如网络错误码）
    this.request = request; // 原始请求对象（如 XHR 对象）
    this.response = response; // 响应对象（仅在有服务器响应时存在）
    this.isAxiosError = true; // 固定标识：所有实例都是 Axios 错误

    // 5. 修复原型链（TypeScript 编译后的特殊处理，确保实例类型正确）
    Object.setPrototypeOf(this, AxiosError.prototype);
  }

}

// 统一错误创建入口
export function createError(
  message: string,
  config: AxiosRequestConfig,
  code?: string | null,
  request?: any,
  response?: AxiosResponse
) {
  const error = new AxiosError(message, config, code, request, response)
  return error
}